#pragma once
#include "bondlib.h"
#include <vector>
#include <string>

enum VSortKey{
	VBOND_NULL = -1,
	VBOND_CODE,			//代码
	VSHORT_NAME,		//简称
	VSHORT_NAME_EN,		//简称
	VEXPIRY_DATE,		//剩余期限
	VBUYVOL,			//Bid.Vol
	VBUYPRICE,			//Bid
	VBUYNETPRICE,		//Bid.NetPrice
	VBUYVOL_SETTLEMENT,			//带清算速度的Bid.Vol
	VBUYPRICE_SETTLEMENT,		//带清算速度的Bid
	VBUYNETPRICE_SETTLEMENT,	//带清算速度的Bid.NetPrice
	VBUYFULLPRICE_SETTLEMENT,	//带清算速度的Bid.FullPrice
	VSELLVOL,			//Ofr.Vol
	VSELLPRICE,			//Ofr
	VSELLNETPRICE,		//Ofr.NetPrice
	VSELLVOL_SETTLEMENT,			//带清算速度的Ofr.Vol
	VSELLPRICE_SETTLEMENT,			//带清算速度的Ofr
	VSELLNETPRICE_SETTLEMENT,		//带清算速度的Ofr.NetPrice
	VSELLFULLPRICE_SETTLEMENT,		//带清算速度的Ofr.FullPrice
	VMODIFY_TIME,		//修改时间
	VMODIFY_TIME_SETTLEMENT,		//带清算速度的修改时间
	VISSUERRATING,		//主体评级
	VBONDRATING,		//债项评级
	VRATING,			//主债评级
	VCDCRATING,			//中债隐含评级
	VCSIRATING,			//中证隐含评级
	VCBRRATING,			//中债资信评级
	VESTBPRICEPRE,		//昨日中债估值
	VESTBPRICETODAY,	//今日中债估值
	VESTBCLEPRICE,		//中债估值净价
	VBOND_TYPE,
	VBUYCLEPRICE,
	VSELLCLEPRICE,
	VMATURITY_DATE,
	VCROSSMARKET,
	VBROKERKEY,
	INDICATIVE_PRICE,	//参考价
	VTKNPRICE,			//成交价
	BSVTKPRICE,			//最优报价中的成交价
	PLANNED_ISSURE_AMOUNT,//计划发行量(亿)
	BID_LIMIT,				//投标区间
	AUCTION_LIMIT,			//标位区间
	ISSUE_START_DATE,		//发行日
	PAYMENT_DATE,			//缴款日
	LISTED_DATE,			//上市日
	PURCHASE_LABEL,			//是否可申购
	INSTITUTION_TYPE,		//企业类型
	ANNOUNCE_DATE,			//公告日
	COUPON_RATE,			//票面利率
	MATURITY_TERM_END,		//期限，按总期限排序
	MATURITY_TERM_2D,		//期限，仅用于发行日历-利率债
	TERM_TO_MATURITY,		//期限，按行权期限排序
	VLIQUIDITY,				//流动性

	AREA,				//地区
	SECTOR,				//行业
	INTEREST_START_DATE,//起息日

	kInstitutionName,	//机构简称
	kIssueEndTime,		//截标时间
	kActualIssureAmount,//实际发行量
	kCouponType,		//利率方式，固息/浮息
	kRateType,			//利率类型，固息/SHIBOR/LPR等
	kIssuerAmount,		//首先取实际发行量，无值时取计划发行量，

	kDuration,			//久期
	kBid_EstPrice,		//bid-中债估值
	kBid_EstPrice_Settlement,	//带清算速度筛选的 bid-中债估值
	kEstPrice_Ofr,		//中债估值-Ofr
	kEstPrice_Ofr_Settlement,	//带清算速度筛选的 中债估值-ofr
	kOutlook,			//展望

	kInstitutionFullName,//发行人机构全称

	//募集时段存在时，日期显示--排序，超级新债通，信用债、私募债,add bushion 20150908
	ISSUE_DATE_IsuPeriod,			//发行日,募集时段存在时,数值等于--
	PAYMENT_DATE_IsuPeriod,			//缴款日,募集时段存在时,数值等于--
	LISTED_DATE_IsuPeriod,			//上市日,募集时段存在时,数值等于--
	ANNOUNCE_DATE_IsuPeriod,		//公告日,募集时段存在时,数值等于--
	INTEREST_DATE_IsuPeriod,		//起息日,募集时段存在时,数值等于--

	kIssuerPeriod,					//募集时段
	kIssueRate,					//发行利率
	kConvRate,						//质押比例


	//新增
	kTknPrice,			//成交净价VTKNPRICE
	kCleanPriceDiv,			//净价偏离度
	kTknYield,				//成交收益率
	kYieldDiv,				//收益率偏离度
	kCouponRate,			//票面利率

	kCdcCleanPrice,			//中债净价
	kCsiVal,				//中证估值 
	kCsiCleanPrice,			//中证净价 
	kOptionType,			//含权类型
	kOptionDate,			//行权日  
	kCsi_Cdc,				//中证一中债
	kCrossMarket,			//跨市场
	kIndustry,				//行业
	kIndustryEn,			//行业英文
	kRatingAgency,			//评级机构   rating agency

	VBondType,				//债券类型
	VBondIssuer,			//债券发行人

	kBondGuarantor,			//担保人
	kBondGuarantorEn,		//担保人英文
	kBondLiquidity,			//债券流动性
	kIssuerLiquidity,		//主体流动性
	kOutstandingAmount,		//债券余额

	kBid_CsiVal,			//bid-中证估值
	kBid_CsiVal_Settlement,	//带清算速度筛选的 bid-中证估值
	kCsiVal_Ofr,			//中证估值-ofr
	kCsiVal_Ofr_Settlement,	//带清算速度筛选的 中证估值-ofr

	kMaturityDate,			//到期日排序,不考虑IssuerPeriod是否有值
	kMaturityDate_IsuPeriod,//到期日排序,考虑IssuerPeriod是否有值

	kDeal_Cdc,				// 成交-中债
	kDeal_Csi,				// 成交-中证

	kCFETS_Buyer,			//CFETS买方
	kCFETS_BidFull,			//CFETS 全价.bid
	kCFETS_BidVol,			//CFETS bid 量
	kCFETS_BidClean,		//CFETS 净价.bid
	kCFETS_Bid,				//CFETS  bid
	kCFETS_Ofr,				//CFETS  ofr
	kCFETS_OfrClean,		//CFETS 净价.ofr
	kCFETS_OfrVol,			//CFETS ofr 量
	kCFETS_OfrFull,			//CFETS 全价.ofr
	kCFETS_Seller,			//CFETS 卖方
	kCFETS_Bid_CdcVal,		//CFETS bid - 中债估值
	kCFETS_CdcVal_Ofr,		//CFETS 中债估值 - ofr
	kCFETS_Bid_CsiVal,		//CFETS bid-中证估值
	kCFETS_CsiVal_Ofr,		//CFETS 中证估值 - ofr
	kCFETS_Update_Time,		//CFETS 更新时间


	kCFETS_Deal_Price,			//CFETS 最新价
	kCFETS_Deal_Increase,		//CFETS 涨跌
	kCFETS_Deal_WeightedMean,	//CFETS 加权平均
	kCFETS_Deal_Open,			//CFETS 开盘
	kCFETS_Deal_High,			//CFETS 最高
	kCFETS_Deal_Low,			//CFETS 最低
	kCFETS_Deal_PreClose,		//CFETS 昨收
	kCFETS_Deal_Vol,			//CFETS 成交量
	kCFETS_Deal_CDC,			//CFETS 成交-中债
	kCFETS_Deal_CSI,			//CFETS 成交-中证
	kCFETS_Deal_Time,			//CFETS 更新时间

	broker_market_Price,		//全市场broker高开低收 - 最新成交
	broker_market_UpDownPrice,	//至今涨幅
	broker_market_Increase,		//涨跌
	broker_market_Open,			//开盘
	broker_market_High,			//最高
	broker_market_Low,			//最低
	broker_market_PreClose,		//昨收
	broker_market_DealCount,	//成交笔数
	broker_market_AttBid,//我的关注bid  最新报价
	broker_market_AttOfr,//我的关注ofr  最新报价
	broker_market_BidOfr,		//买家/卖家
	broker_market_CDCDeal,		//成交-中债
	broker_market_CSIDeal,		//成交-中证
	broker_market_UpdateTime,	//最后更新
	fisse_deal_netprice,		//上证固收成交净价
	fisse_deal_fullprice,		//上证固收成交全价
	fisse_deal_yield,			//上证固收成交收益率
	fisse_deal_volumn,			//上证固收成交量
	fisse_deal_amount,			//上证固收成交额

	kTknCleanCleanPrice,	//成交净价

	kABSBondBaseType,		//ABS基础资产
	kABSBondSeries,			//ABS系列
	kABSBondIssuer,			//ABS发行人
	kBondMainUnderwriter,	//主承机构

	//以下为自定义排序类型
	kUserSortKey1 = 1000,				//自定义排序类型
	kUserSortKey2,
	kUserSortKey3,
	kUserSortKey4,
	kUserSortKey5,
	kUserSortKey6,
	kUserSortKey7,
	kUserSortKey8,
	kUserSortKey9,
	kUserSortKey10,
	kUserSortKey11,
	kUserSortKey12,
	kUserSortKey13,
	kUserSortKey14,
	kUserSortKey15,
	kUserSortKey16,
	kUserSortKey17,
	kUserSortKey18,
	kUserSortKey19,
	kUserSortKey20,
};

//-------------------------------------------------------------------------
// Summary:
// 		SSortInfo排序结构体
//-------------------------------------------------------------------------
struct S_BONDLIB_EXPORT CSortInfo
{
public:
	CSortInfo(int nSortKey = VBOND_NULL,bool bDesc = false):m_nSortKey(nSortKey),m_bDesc(bDesc)
	{
	}

	int	 m_nSortKey;	//排序类型
	bool m_bDesc;		//true表示降序
};


class S_BONDLIB_EXPORT CSortInfoManager
{
public:
	CSortInfoManager():m_bDirectReverse(false)
	{
	}

	~CSortInfoManager(){}


	//-------------------------------------------------------------------------
	// Summary:
	// 		初始化排序规则数据
	// Parameters:
	// 		nSortKey - 排序规则
	// 		bDesc - true表示降序
	// Returns:
	// 		void
	//-------------------------------------------------------------------------
	void InitData(int nSortKey = VMODIFY_TIME,bool bDesc = true);

	//-------------------------------------------------------------------------
	// Summary:
	// 		更新数据
	//      规则：
	//          1、按下Ctrl键，若之前sortKey存在，则排序规则取反且放入最后位置，否则加入到最后面
	//          2、没有按下Ctrl键,清除旧数据，只存最新一条排序规则,若之前sortKey存在，则排序规则取反
	// Parameters:
	// 		bPressCtrlKey - true表示按下了CTRL键
	// 		nSortKey - 排序key
	// 		bDesc - true表示降序
	// Returns:
	// 		void
	//-------------------------------------------------------------------------
	void AddOrUpdate(bool bPressCtrlKey,int nSortKey,bool bDesc = false);


	//-------------------------------------------------------------------------
	// Summary:
	// 		根据排序key得到排序数据
	// Parameters:
	// 		nSortKey - 排序key
	// 		sortInfo - 排序数据
	// Returns:
	// 		若成功得到返回true,否则返回false
	//-------------------------------------------------------------------------
	bool GetSortInfo(int nSortKey,CSortInfo &sortInfo)const;


	//-------------------------------------------------------------------------
	// Summary:
	// 		判断是否含有排序类型
	// Parameters:
	// 		nSortKey - 排序Key
	// Returns:
	// 		若有返回true,否则返回false
	//-------------------------------------------------------------------------
	bool HasSortKey(int nSortKey) const;
	bool HasSortKey(const std::vector<int> &vecSortKey) const;


	int GetSize() const {return (int)m_vecSortInfo.size();}
	void Clear() {m_vecSortInfo.clear();}

	const std::vector<CSortInfo>& GetData()const {return m_vecSortInfo;}


	//-------------------------------------------------------------------------
	// Summary:
	// 		设置是否直接反序排序
	// Parameters:
	// 		bStatus - 
	// Returns:
	// 		若成功返回true,否则返回false
	//-------------------------------------------------------------------------
	void SetDirectReverse(bool bStatus = false){m_bDirectReverse = bStatus;}
	bool IsDirectReverse() const {return m_bDirectReverse;}
	bool IsSatisfyDirectReverse() const;

	//-------------------------------------------------------------------------
	// Summary:
	// 		设置公司名称，价格等参数，与公司有关
	// Parameters:
	// 		sSortCorp - 公司名称。（broker 全部排序时，传入空值）
	// Returns:
	// 		void
	//-------------------------------------------------------------------------
	void SetSortCorp(const std::string &sSortCorp) {m_sSortCorp = sSortCorp;};
	const char * GetSortCorp() const {return m_sSortCorp.c_str();}

private:
	//-------------------------------------------------------------------------
	// Summary:
	// 		添加或者更新，若存在，则排序规则取反且放入最后位置，否则加入到最后面
	// Parameters:
	// 		nSortKey - 排序key
	// 		bDesc - true表示降序
	// Returns:
	// 		
	//-------------------------------------------------------------------------
	void AddOrUpdateEx(int nSortKey,bool bDesc = true);

public:
	std::vector<CSortInfo> m_vecSortInfo; //排序内容

private:
	std::string m_sSortCorp;				//公司名称，broker的id
	bool m_bDirectReverse;			//直接反序，若只选择一列，且与上次列项相同与反序时，可以直接进行反序操作。
}; 